package com.stefanini.pe.bbva.bp.in.dao.impl;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.stereotype.Repository;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.stefanini.pe.bbva.bp.in.dao.iface.CalculadoraModDAOIface;
import com.stefanini.pe.bbva.bp.in.to.FactorTipoCambio;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Repository(value="calculadoraModDAO")
public class CalculadoraModDAOImpl extends SqlMapClientDaoSupport implements CalculadoraModDAOIface {
	
	@Autowired
	public CalculadoraModDAOImpl(SqlMapClient sqlMapClient) {
		setSqlMapClient(sqlMapClient);
	}
	
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> listarDistribucionCategoriaActivos(String codCliente,String codContratos,String codRegistro){		
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_codcontrato", codContratos);
		map.put("in_codcliente", codCliente);
		map.put("in_codregistro", codRegistro);
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_cons_as_rdistribactivos_2, params: "+map);
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.distribucionCatActivo",map);
		return (List<Map<String, Object>>)map.get("result");
	}
	
	public FactorTipoCambio ObtenerFactorTipoCambio(){		
		HashMap<String,Object> map=new HashMap<String,Object>();				
		getSqlMapClientTemplate().queryForObject("BP_CALCULADORAMOD_SqlMap.factorTipoCambio",map);
		FactorTipoCambio ftc=new FactorTipoCambio();
		ftc.setDolaresToEuros(big(map.get("OUT_FACTORDOLARESEUROS")));
		ftc.setDolaresToSoles(big(map.get("OUT_FACTORDOLARESSOLES")));
		ftc.setSolesToEuros(big(map.get("OUT_FACTORSOLESEUROS")));		
		ftc.setEurosToDolares(big(map.get("OUT_FACTOREUROSDOLARES")));
		ftc.setSolesToDolares(big(map.get("OUT_FACTORSOLESDOLARES")));
		ftc.setEurosToSoles(big(map.get("OUT_FACTOREUROSSOLES")));		
		return ftc;
	}
	
	public FactorTipoCambio ObtenerFactorTipoCambio(String fecha){		
		HashMap<String,Object> map=new HashMap<String,Object>();	
		map.put("IN_FECHA",fecha);
		getSqlMapClientTemplate().queryForObject("BP_CALCULADORAMOD_SqlMap.factorTipoCambioXFecha",map);
		FactorTipoCambio ftc=new FactorTipoCambio();
		ftc.setDolaresToEuros(big(map.get("OUT_FACTORDOLARESEUROS")));
		ftc.setDolaresToSoles(big(map.get("OUT_FACTORDOLARESSOLES")));
		ftc.setSolesToEuros(big(map.get("OUT_FACTORSOLESEUROS")));		
		ftc.setEurosToDolares(big(map.get("OUT_FACTOREUROSDOLARES")));
		ftc.setSolesToDolares(big(map.get("OUT_FACTORSOLESDOLARES")));
		ftc.setEurosToSoles(big(map.get("OUT_FACTOREUROSSOLES")));		
		return ftc;
	}
	
	public BigDecimal big(Object valor){
		if(valor!=null&&valor.toString().length()!=0)
			return new BigDecimal(Util.formatearNumber(valor.toString()));
		return new BigDecimal(0);
	}
	
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> listarCalculadora(String codCliente,String codContratos){		
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_codcontrato", codContratos);
		map.put("in_codcliente", codCliente);		
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.listarClaculadora",map);
		return (List<Map<String, Object>>)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> calculoPropuesta(String idCatActivo,String codProducto,String codSubproducto,String monto,String moneda){		
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_idcategoriaactivo", idCatActivo);
		map.put("in_codproducto", codProducto);		
		map.put("in_codsubproducto", codSubproducto);
		map.put("in_monto", monto);
		map.put("in_moneda", moneda);				
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.calculoPropuestaRebalanceo",map);		
		return (List<Map<String, Object>>)map.get("result");
	}

	public String guardarCalculadora(String codCliente, String idUsuarioAsesor,
			String comentario, String tipo, String idCategoriaActivo,
			String idCategoriaProducto, String codProducto,
			String codSubProducto, String descripcion, String moneda,
			String plazo, String saldoActual, String saldoRetenido,
			String rentabilidad, String calculadoraPEN, String calculadoraUSD,
			String calculadoraEUR, String rentabilidadEstimada,
			String descripcionDistrib,
			String saldoActualPENDistrib,
			String saldoActualUSDDistrib,
			String saldoActualEURDistrib,
			String perfilActualDistrib,
			String perfilIdealDistrib,
			String perfilSugeridoDistrib,
			String saldoSugeridoUSDDistrib,
			String saldoSugeridoPENDistrib,
			String saldoSugeridoEURDistrib,
			String idCatActivoDistrib,
			String monedaDetalleDetalle,
			String operacionDetalleDetalle,
		    String montoDetalleDetalle,
		    String fuenteDetalleRecurso,
			String procedenciaDetalleRecurso,
			String montoDetalleRecurso,
			String nroContratos,
			String codUsuCrea,
			String terminal) throws Exception{
		
			HashMap<String,Object> map=new HashMap<String,Object>();
			map.put("in_codcliente", codCliente);
			map.put("in_idusuarioasesor", idUsuarioAsesor);		
			map.put("in_comentario", comentario);
			map.put("in_tipo", tipo);
			map.put("in_idcategoriaactivo", idCategoriaActivo);				
			map.put("in_idcategoriaproducto", idCategoriaProducto);
			map.put("in_codproducto", codProducto);
			map.put("in_codsubproducto", codSubProducto);
			map.put("in_descripcion", descripcion);
			map.put("in_moneda", moneda);
			map.put("in_plazo", plazo);
			map.put("in_saldoactual", saldoActual);
			map.put("in_saldoretenido", saldoRetenido);
			map.put("in_rentabilidad", rentabilidad);
			map.put("in_calculadorapen", calculadoraPEN);
			map.put("in_calculadorausd", calculadoraUSD);
			map.put("in_calculadoraeur", calculadoraEUR);
			map.put("in_rentabilidadestimada", rentabilidadEstimada);
			
			map.put("in_descripciondistrib", descripcionDistrib);
			map.put("in_saldoactualpendistrib", saldoActualPENDistrib);
			map.put("in_saldoactualusddistrib", saldoActualUSDDistrib);
			map.put("in_saldoactualeurdistrib", saldoActualEURDistrib);
			map.put("in_perfilactualdistrib", perfilActualDistrib);
			map.put("in_perfilidealdistrib", perfilIdealDistrib);
			map.put("in_perfilsugeridodistrib", perfilSugeridoDistrib);
			map.put("in_saldosugeridousddistrib", saldoSugeridoUSDDistrib);
			map.put("in_saldosugeridopendistrib", saldoSugeridoPENDistrib);
			map.put("in_saldosugeridoeurdistrib", saldoSugeridoEURDistrib);
			map.put("in_idCatActivoDistrib", idCatActivoDistrib);
						
			map.put("in_monedaDetalleDetalle", monedaDetalleDetalle);
			map.put("in_operacionDetalleDetalle", operacionDetalleDetalle);
			map.put("in_montoDetalleDetalle", montoDetalleDetalle);
			
			map.put("in_fuenteDetalleRecurso", fuenteDetalleRecurso);
			map.put("in_procedenciaDetalleRecurso", procedenciaDetalleRecurso);
			map.put("in_montoDetalleRecurso", montoDetalleRecurso);
			
			map.put("in_codcontratos", nroContratos);
			map.put("in_codusucrea", codUsuCrea);
			map.put("in_terminal", terminal);	
			getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.guardarCalculadora",map);
		    return map.get("out_idrebalanceo").toString();
	}

	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> listarCalculadoraRecursos(){		
		HashMap<String,Object> map=new HashMap<String,Object>();		
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.listarCalculadoraRecursos",map);
		return (List<Map<String, Object>>)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> listarDistribucionCalcEdicion(String idrebalanceo){//abarrios		
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_idrebalanceo", idrebalanceo);
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.distribucionCalEdicion",map);
		return (List<Map<String, Object>>)map.get("result");
	}

	public String eliminaCalculadora(String idrebalanceo) throws Exception{
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_idrebalanceo", idrebalanceo);
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.eliminaCalculadora",map);
	    return map.get("po_retorno").toString();
	}
	
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> listarDistribucionCalcEdicionDetalle(String idrebalanceo,String idrebalanceodet){//abarrios		
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_idrebalanceo", idrebalanceo);
		map.put("in_idrebalanceoDet", idrebalanceodet);
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.distribucionCalEdicionDetalleSaldo",map);
		return (List<Map<String, Object>>)map.get("result");
	}
}
